Skip to content

Conversation

@Myestery
Copy link
Collaborator

@Myestery Myestery commented Oct 30, 2025

This pull request introduces several improvements to the node context menu in the graph selection toolbox, focusing on enhanced usability, accessibility, and maintainability. The most significant changes are the addition of a search/filter feature for menu options, improved handling and display of disabled and categorized menu items, and better viewport-aware positioning for popovers and submenus.

Menu Usability & Filtering:

  • Added a search input at the top of the node options menu, allowing users to filter menu items by label. Filtering contextually hides dividers and category labels, and resets/focuses the search field when the menu is opened or closed. (NodeOptions.vue, useMoreOptionsMenu.ts) [1] [2] [3] [4] [5]

Menu Item Display & Accessibility:

  • Improved menu item rendering to support category labels and visually distinguish disabled options. Disabled options are now styled and prevented from triggering actions when clicked. (MenuOptionItem.vue, SubmenuPopover.vue, useMoreOptionsMenu.ts) [1] [2] [3] [4] [5]
  • Extended the menu option type definitions to include category and disabled flags, and added a source field for distinguishing between hardcoded and dynamic options. (useMoreOptionsMenu.ts) [1] [2]

Popover & Submenu Positioning:

  • Refactored popover positioning logic to use a viewport-aware utility, preventing menus and submenus from overflowing the visible area. Submenus now dock to the bottom of the viewport if they would otherwise overflow. (NodeOptions.vue, SubmenuPopover.vue) [1] [2]

Codebase Maintenance:

  • Updated imports and removed unused code related to canvas interactions, and improved composable structure for menu options. (NodeOptions.vue, useMoreOptionsMenu.ts) [1] [2] [3] [4]

These changes collectively enhance the user experience for interacting with node options, making the menu more navigable, accessible, and robust.

Recording.2025-11-11.235411.mp4

@github-actions
Copy link

github-actions bot commented Oct 30, 2025

🎨 Storybook Build Status

Build completed successfully!

⏰ Completed at: 11/15/2025, 12:58:50 AM UTC

🔗 Links


🎉 Your Storybook is ready for review!

@github-actions
Copy link

github-actions bot commented Oct 30, 2025

🎭 Playwright Test Results

Some tests failed

⏰ Completed at: 11/15/2025, 01:10:37 AM UTC

📈 Summary

  • Total Tests: 500
  • Passed: 468 ✅
  • Failed: 1 ❌
  • Flaky: 1 ⚠️
  • Skipped: 30 ⏭️

📊 Test Reports by Browser

  • chromium: View Report • ✅ 459 / ❌ 1 / ⚠️ 1 / ⏭️ 30
  • chromium-2x: View Report • ✅ 2 / ❌ 0 / ⚠️ 0 / ⏭️ 0
  • chromium-0.5x: View Report • ✅ 1 / ❌ 0 / ⚠️ 0 / ⏭️ 0
  • mobile-chrome: View Report • ✅ 6 / ❌ 0 / ⚠️ 0 / ⏭️ 0

🎉 Click on the links above to view detailed test results for each browser configuration.

@github-actions
Copy link

github-actions bot commented Oct 30, 2025

Bundle Size Report

Summary

  • Raw size: 13.6 MB baseline 13.6 MB — 🔴 +23.7 kB
  • Gzip: 2.73 MB baseline 2.73 MB — 🔴 +5.76 kB
  • Brotli: 2.15 MB baseline 2.14 MB — 🔴 +4.32 kB
  • Bundles: 88 current • 88 baseline • 34 added / 34 removed

Category Glance
Graph Workspace 🔴 +23.7 kB (827 kB) · App Entry Points 🔴 +28 B (2.98 MB) · Vendor & Third-Party ⚪ 0 B (5.32 MB) · Other ⚪ 0 B (3.92 MB) · Panels & Settings ⚪ 0 B (307 kB) · UI Components ⚪ 0 B (210 kB) · + 3 more

Per-category breakdown
App Entry Points — 2.98 MB (baseline 2.98 MB) • 🔴 +28 B

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-CcO58cme.js (new) 2.62 MB 🔴 +2.62 MB 🔴 +551 kB 🔴 +419 kB
assets/index-nxpJPNQ0.js (removed) 2.62 MB 🟢 -2.62 MB 🟢 -551 kB 🟢 -419 kB
assets/index-DLzGOG-7.js (new) 365 kB 🔴 +365 kB 🔴 +75.3 kB 🔴 +61.4 kB
assets/index-QK9uZ2Fg.js (removed) 365 kB 🟢 -365 kB 🟢 -75.3 kB 🟢 -61.4 kB
assets/index-CnuSv4ys.js (removed) 345 B 🟢 -345 B 🟢 -245 B 🟢 -210 B
assets/index-CW4_fdmG.js (new) 345 B 🔴 +345 B 🔴 +243 B 🔴 +233 B

Status: 3 added / 3 removed

Graph Workspace — 827 kB (baseline 803 kB) • 🔴 +23.7 kB

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-BjRV6Nkn.js (new) 827 kB 🔴 +827 kB 🔴 +163 kB 🔴 +125 kB
assets/GraphView-iX_zdQJ_.js (removed) 803 kB 🟢 -803 kB 🟢 -157 kB 🟢 -121 kB

Status: 1 added / 1 removed

Views & Navigation — 8.03 kB (baseline 8.03 kB) • ⚪ 0 B

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/UserSelectView-Bt_0itTi.js (removed) 8.03 kB 🟢 -8.03 kB 🟢 -2.44 kB 🟢 -2.15 kB
assets/UserSelectView-CYWDHz2I.js (new) 8.03 kB 🔴 +8.03 kB 🔴 +2.44 kB 🔴 +2.15 kB

Status: 1 added / 1 removed

Panels & Settings — 307 kB (baseline 307 kB) • ⚪ 0 B

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CreditsPanel-BwuqROXY.js (new) 23 kB 🔴 +23 kB 🔴 +5.47 kB 🔴 +4.78 kB
assets/CreditsPanel-DEVfL5uF.js (removed) 23 kB 🟢 -23 kB 🟢 -5.47 kB 🟢 -4.79 kB
assets/KeybindingPanel-DGIyCbH3.js (removed) 15.1 kB 🟢 -15.1 kB 🟢 -3.74 kB 🟢 -3.29 kB
assets/KeybindingPanel-G1uvAfim.js (new) 15.1 kB 🔴 +15.1 kB 🔴 +3.74 kB 🔴 +3.3 kB
assets/ExtensionPanel-CK23bQ9H.js (removed) 12 kB 🟢 -12 kB 🟢 -2.81 kB 🟢 -2.47 kB
assets/ExtensionPanel-DfLtHdmi.js (new) 12 kB 🔴 +12 kB 🔴 +2.8 kB 🔴 +2.47 kB
assets/AboutPanel-BtLwOXha.js (removed) 10.2 kB 🟢 -10.2 kB 🟢 -2.63 kB 🟢 -2.34 kB
assets/AboutPanel-DeDv1Rbk.js (new) 10.2 kB 🔴 +10.2 kB 🔴 +2.63 kB 🔴 +2.31 kB
assets/ServerConfigPanel-b6wUt2Nz.js (removed) 8.09 kB 🟢 -8.09 kB 🟢 -2.13 kB 🟢 -1.89 kB
assets/ServerConfigPanel-Hmexj_E-.js (new) 8.09 kB 🔴 +8.09 kB 🔴 +2.13 kB 🔴 +1.89 kB
assets/UserPanel-CpZPpLvH.js (new) 7.8 kB 🔴 +7.8 kB 🔴 +2.04 kB 🔴 +1.78 kB
assets/UserPanel-CUixwagV.js (removed) 7.8 kB 🟢 -7.8 kB 🟢 -2.04 kB 🟢 -1.78 kB
assets/settings-BXTtSH4O.js 33.3 kB 33.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-C9Pzn-NG.js 25.2 kB 25.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CCy2fA_h.js 27.3 kB 27.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CQpqEFfl.js 26.6 kB 26.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DHcnxypw.js 21.7 kB 21.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DhFTK9fY.js 25.1 kB 25.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DlT4t_ui.js 25.9 kB 25.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DRgSrIdD.js 24.2 kB 24.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-tjkeqiZq.js 21.1 kB 21.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 6 added / 6 removed

UI Components — 210 kB (baseline 210 kB) • ⚪ 0 B

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/Load3D.vue_vue_type_script_setup_true_lang-CW13W6AT.js (new) 128 kB 🔴 +128 kB 🔴 +21.3 kB 🔴 +17.4 kB
assets/Load3D.vue_vue_type_script_setup_true_lang-j0-xT9lj.js (removed) 128 kB 🟢 -128 kB 🟢 -21.3 kB 🟢 -17.4 kB
assets/WidgetSelect.vue_vue_type_script_setup_true_lang-Cef1Evxc.js (removed) 47.9 kB 🟢 -47.9 kB 🟢 -10.4 kB 🟢 -9.01 kB
assets/WidgetSelect.vue_vue_type_script_setup_true_lang-CkPI6IYz.js (new) 47.9 kB 🔴 +47.9 kB 🔴 +10.4 kB 🔴 +9.03 kB
assets/ComfyQueueButton-C7f2Ov22.js (removed) 11.2 kB 🟢 -11.2 kB 🟢 -2.79 kB 🟢 -2.47 kB
assets/ComfyQueueButton-CVvyZS4d.js (new) 11.2 kB 🔴 +11.2 kB 🔴 +2.79 kB 🔴 +2.47 kB
assets/WidgetSelectButton-aRy3b9ik.js (removed) 6.59 kB 🟢 -6.59 kB 🟢 -1.95 kB 🟢 -1.71 kB
assets/WidgetSelectButton-DX5L9Fmo.js (new) 6.59 kB 🔴 +6.59 kB 🔴 +1.95 kB 🔴 +1.71 kB
assets/WidgetLayoutField.vue_vue_type_script_setup_true_lang-Dx-3E2Ax.js (removed) 2.16 kB 🟢 -2.16 kB 🟢 -810 B 🟢 -706 B
assets/WidgetLayoutField.vue_vue_type_script_setup_true_lang-ogBaHBVo.js (new) 2.16 kB 🔴 +2.16 kB 🔴 +810 B 🔴 +707 B
assets/LazyImage.vue_vue_type_script_setup_true_lang-CYFSl-yC.js 10.7 kB 10.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserAvatar.vue_vue_type_script_setup_true_lang-D2s8tnS2.js 1.26 kB 1.26 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetButton-ByrPd5jr.js 1.62 kB 1.62 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 5 added / 5 removed

Data & Services — 12.6 kB (baseline 12.6 kB) • ⚪ 0 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/keybindingService-AGJ-mqXV.js (new) 7.6 kB 🔴 +7.6 kB 🔴 +1.84 kB 🔴 +1.59 kB
assets/keybindingService-lJlmkepP.js (removed) 7.6 kB 🟢 -7.6 kB 🟢 -1.84 kB 🟢 -1.59 kB
assets/audioService-BlrdWBTw.js (new) 2.2 kB 🔴 +2.2 kB 🔴 +960 B 🔴 +820 B
assets/audioService-Cxc9N1qn.js (removed) 2.2 kB 🟢 -2.2 kB 🟢 -962 B 🟢 -822 B
assets/serverConfigStore-CLQ4OLsV.js 2.79 kB 2.79 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 2 added / 2 removed

Utilities & Hooks — 5.87 kB (baseline 5.87 kB) • ⚪ 0 B

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/audioUtils-BcdPDzyH.js (removed) 1.41 kB 🟢 -1.41 kB 🟢 -651 B 🟢 -549 B
assets/audioUtils-jVcvyAMP.js (new) 1.41 kB 🔴 +1.41 kB 🔴 +651 B 🔴 +543 B
assets/mathUtil-CTARWQ-l.js 1.07 kB 1.07 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeFilterUtil-CXKCRJ-m.js 460 B 460 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useTransformCompatOverlayProps-YaCpDdzr.js 486 B 486 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useWidgetValue-IC6pgigJ.js 2.45 kB 2.45 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 1 added / 1 removed

Vendor & Third-Party — 5.32 MB (baseline 5.32 MB) • ⚪ 0 B

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-other-BD-fEGPG.js 3.22 MB 3.22 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-primevue-PESgPnbc.js 517 B 517 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-three-aR6ntw5X.js 1.37 MB 1.37 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-_bKlu4y-.js 232 kB 232 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vue-DkPfYpIU.js 92.6 kB 92.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-BZLod3g9.js 407 kB 407 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Other — 3.92 MB (baseline 3.92 MB) • ⚪ 0 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/WidgetRecordAudio-BgTyY0wq.js (removed) 22.2 kB 🟢 -22.2 kB 🟢 -5.59 kB 🟢 -4.94 kB
assets/WidgetRecordAudio-CZdEE5Qd.js (new) 22.2 kB 🔴 +22.2 kB 🔴 +5.59 kB 🔴 +4.94 kB
assets/AudioPreviewPlayer-BVVKCzgj.js (new) 14.9 kB 🔴 +14.9 kB 🔴 +3.73 kB 🔴 +3.32 kB
assets/AudioPreviewPlayer-CXcBCxYn.js (removed) 14.9 kB 🟢 -14.9 kB 🟢 -3.72 kB 🟢 -3.32 kB
assets/WidgetInputNumber-Ba-Yxl7T.js (new) 14.6 kB 🔴 +14.6 kB 🔴 +3.79 kB 🔴 +3.36 kB
assets/WidgetInputNumber-BjJv3akj.js (removed) 14.6 kB 🟢 -14.6 kB 🟢 -3.79 kB 🟢 -3.36 kB
assets/WidgetGalleria-B2FT6k-V.js (removed) 5.62 kB 🟢 -5.62 kB 🟢 -1.75 kB 🟢 -1.55 kB
assets/WidgetGalleria-DZwvZBPl.js (new) 5.62 kB 🔴 +5.62 kB 🔴 +1.75 kB 🔴 +1.55 kB
assets/WidgetColorPicker-SOXcdOP2.js (new) 4.91 kB 🔴 +4.91 kB 🔴 +1.68 kB 🔴 +1.47 kB
assets/WidgetColorPicker-UNnYMboA.js (removed) 4.91 kB 🟢 -4.91 kB 🟢 -1.68 kB 🟢 -1.48 kB
assets/WidgetMarkdown-B2O1xQTj.js (new) 4.88 kB 🔴 +4.88 kB 🔴 +1.7 kB 🔴 +1.47 kB
assets/WidgetMarkdown-CYvZCXS_.js (removed) 4.88 kB 🟢 -4.88 kB 🟢 -1.7 kB 🟢 -1.47 kB
assets/WidgetAudioUI-Dh16Sn9h.js (new) 4.49 kB 🔴 +4.49 kB 🔴 +1.49 kB 🔴 +1.34 kB
assets/WidgetAudioUI-DsE5uiMw.js (removed) 4.49 kB 🟢 -4.49 kB 🟢 -1.49 kB 🟢 -1.33 kB
assets/WidgetMultiSelect-BLxbQJtS.js (removed) 4.3 kB 🟢 -4.3 kB 🟢 -1.46 kB 🟢 -1.27 kB
assets/WidgetMultiSelect-XAmmhZtk.js (new) 4.3 kB 🔴 +4.3 kB 🔴 +1.45 kB 🔴 +1.27 kB
assets/WidgetTreeSelect-CB02v56o.js (removed) 4.03 kB 🟢 -4.03 kB 🟢 -1.38 kB 🟢 -1.21 kB
assets/WidgetTreeSelect-Du7QEB6h.js (new) 4.03 kB 🔴 +4.03 kB 🔴 +1.38 kB 🔴 +1.21 kB
assets/WidgetTextarea-Bl6TsSXf.js (removed) 3.74 kB 🟢 -3.74 kB 🟢 -1.29 kB 🟢 -1.14 kB
assets/WidgetTextarea-TQIG8CjY.js (new) 3.74 kB 🔴 +3.74 kB 🔴 +1.29 kB 🔴 +1.13 kB
assets/WidgetInputText-D9-mBsHw.js (new) 3.66 kB 🔴 +3.66 kB 🔴 +1.27 kB 🔴 +1.13 kB
assets/WidgetInputText-DJNk-B4D.js (removed) 3.66 kB 🟢 -3.66 kB 🟢 -1.27 kB 🟢 -1.13 kB
assets/WidgetToggleSwitch-B0b5TJw_.js (removed) 3.52 kB 🟢 -3.52 kB 🟢 -1.22 kB 🟢 -1.07 kB
assets/WidgetToggleSwitch-CkGNxzlE.js (new) 3.52 kB 🔴 +3.52 kB 🔴 +1.22 kB 🔴 +1.08 kB
assets/WidgetSelect-80WLZO0N.js (removed) 2.33 kB 🟢 -2.33 kB 🟢 -731 B 🟢 -619 B
assets/WidgetSelect-B5_x9vAE.js (new) 2.33 kB 🔴 +2.33 kB 🔴 +729 B 🔴 +620 B
assets/Load3D-BCQrxVx_.js (new) 2.01 kB 🔴 +2.01 kB 🔴 +609 B 🔴 +507 B
assets/Load3D-kYcmvkOM.js (removed) 2.01 kB 🟢 -2.01 kB 🟢 -608 B 🟢 -508 B
assets/WidgetLegacy-BnEm6n9U.js (removed) 1.95 kB 🟢 -1.95 kB 🟢 -572 B 🟢 -508 B
assets/WidgetLegacy-DfQjPGkw.js (new) 1.95 kB 🔴 +1.95 kB 🔴 +573 B 🔴 +480 B
assets/commands-_6uSNVYB.js 14.9 kB 14.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BaAvtVOT.js 14.7 kB 14.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BRKOlMPq.js 15.4 kB 15.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-C1kmJUO0.js 14.9 kB 14.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CHLkz7NH.js 17.4 kB 17.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-cLsDwHMQ.js 14 kB 14 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Ct50VUT9.js 16.2 kB 16.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DOEnM922.js 14.1 kB 14.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Ds4Sq2CW.js 15.7 kB 15.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BjHbZI-o.js 97.5 kB 97.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BsmSUEg9.js 75.9 kB 75.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-C1dqVsBC.js 103 kB 103 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CTcPPkuZ.js 87.4 kB 87.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CwX98cQA.js 89.7 kB 89.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DFyT7zKX.js 84.8 kB 84.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DHvyJYQT.js 74.9 kB 74.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-ruI2u5eb.js 118 kB 118 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-UdMyOcTd.js 86.4 kB 86.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-_Px5dSNW.js 306 kB 306 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-7z21KPoS.js 285 kB 285 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BWKZzBPK.js 346 kB 346 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CGbgH4Yl.js 320 kB 320 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CjjjdWkV.js 313 kB 313 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CVrNtxvj.js 288 kB 288 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DLRSA0IK.js 309 kB 309 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DQV2gnwA.js 372 kB 372 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-ofqLG5vz.js 310 kB 310 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetChart-4dlndULn.js 2.44 kB 2.44 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetFileUpload-Cx6dGznS.js 11.9 kB 11.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCompare-Ds3K3ULR.js 2.15 kB 2.15 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-BIbGSUAt.js 1.28 kB 1.28 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 15 added / 15 removed

- Add disabled property to MenuOption and SubMenuOption interfaces
- Apply semantic token styling for disabled items (text-node-icon-disabled)
- Prevent interactions on disabled menu and submenu items
- Use cursor-not-allowed and pointer-events-none for disabled state
- Pass through disabled flag from LiteGraph menu items to Vue components
Add translation key for the Extensions section label in the context menu.
This allows the Extensions category header to be properly localized.
Add support for non-clickable category labels in the context menu.
Category items are displayed as uppercase labels with secondary text color
and proper translation support via contextMenu namespace.

This enables grouping menu items under section headers like "Extensions".
Add comprehensive menu ordering system to ensure consistent context menu layout:
- Define MENU_ORDER constant with 5 logical sections
- Implement automatic section-based divider insertion
- Separate core items from extension items
- Add blacklist for unwanted duplicate items (Colors, Shapes, Title, Mode, etc.)
- Preserve Vue hardcoded options over LiteGraph items during deduplication
- Add source tracking (litegraph vs vue) for precedence handling

Menu structure:
1. Basic operations (Rename, Copy, Duplicate)
2. Node actions (Run Branch, Pin, Bypass, Mute)
3. Structure operations (Convert to Subgraph, Frame selection, Minimize Node)
4. Node properties (Node Info, Color)
5. Node-specific operations (Image operations)
6. Extensions section (non-core items)
7. Delete (always at bottom)

The system ensures proper ordering regardless of whether items come from
LiteGraph or Vue hardcoded menus, with Extensions clearly separated.
Reorder menu sections to follow the specification:
1. Basic operations: Rename, Copy, Duplicate
2. Node actions: Run Branch, Pin, Bypass, Mute (for groups)
3. Structure operations: Convert to Subgraph, Frame selection, Minimize Node
4. Node properties: Node Info, Color (Shape removed)
5. Node-specific operations: Image operations only

Changes:
- Add explicit dividers after each section
- Remove Shape, Alignment, and Adjust Size options
- Merge LiteGraph and Vue options for single node selection
- Add source tracking (vue) for precedence during deduplication
- Add comprehensive logging for debugging menu construction

For single node selection, both LiteGraph and Vue options are merged
with Vue options taking precedence, then structured via buildStructuredMenu.
Add real-time search filtering to the node context menu:
- Search input with icon at the top of the menu
- Case-insensitive filtering by menu item label
- Auto-focus on menu open
- Clear search on Escape key or menu close
- Smart divider handling (removes unnecessary dividers during search)
- Hides Extensions category label when searching

The search provides instant feedback as users type, making it easier
to find specific menu items in long context menus.
Move Resize and Clone menu items from fallback section to Section 3
(Structure operations) so they appear alongside Convert to Subgraph,
Frame selection, and Minimize Node.

Updated section boundaries:
- Section 3 now spans indices 9-15 (was 9-13)
- Section 4 now spans indices 16-17 (was 14-15)

This ensures Resize and Clone appear under the same divider group
as other structure-related operations.
When right-clicking near the bottom of the viewport, the context menu now docks to the bottom edge instead of floating off-screen, ensuring it remains accessible and scrollable.
@Myestery Myestery marked this pull request as ready for review November 11, 2025 22:52
@dosubot dosubot bot added the size:XXL This PR changes 1000+ lines, ignoring generated files. label Nov 11, 2025
@DrJKL DrJKL force-pushed the right-click-vue-node-contextmenu branch from 3d05c49 to 8e7026d Compare November 12, 2025 21:16
import { useCanvasInteractions } from '@/renderer/core/canvas/useCanvasInteractions'
import { calculateMenuPosition } from '@/composables/graph/useViewportAwareMenuPositioning'
// import { useCanvasInteractions } from '@/renderer/core/canvas/useCanvasInteractions'
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
// import { useCanvasInteractions } from '@/renderer/core/canvas/useCanvasInteractions'

Comment on lines +121 to +148
if (option.type === 'category') {
continue
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Question: What happens if we have dividers adjacent to categories (not sure what order)?

Comment on lines +196 to +222
overlayEl.style.position = style.position
overlayEl.style.left = style.left
overlayEl.style.transform = style.transform
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Doing multiple style assignments can be a source of repaints
https://dev.to/gopal1996/understanding-reflow-and-repaint-in-the-browser-1jbg

Comment on lines +108 to +110
overlayEl.style.position = 'fixed'
overlayEl.style.bottom = '0px'
overlayEl.style.top = ''
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same here, plus the queries above for a few different dimensions
https://dev.to/gopal1996/understanding-reflow-and-repaint-in-the-browser-1jbg

}
const repositionSubmenu = () => {
const overlayEl = (popover.value as any)?.$el as HTMLElement
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Replaces simple substring matching with Fuse.js fuzzy search for better
user experience. Adds 300ms debouncing to reduce processing overhead.
Includes debug logging for troubleshooting.
@Myestery Myestery force-pushed the right-click-vue-node-contextmenu branch from 8e7026d to 52b7b5c Compare November 15, 2025 00:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL This PR changes 1000+ lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants